package com.sqfw.project.knowledge.service.impl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.sqfw.common.constant.Constants;
import com.sqfw.common.enums.knowledge.KlFileTypeEnum;
import com.sqfw.framework.web.domain.AjaxResult;
import com.sqfw.project.knowledge.domain.KlContentFileInfo;
import com.sqfw.project.knowledge.mapper.KlContentFileInfoMapper;
import com.sqfw.project.knowledge.service.KlContentFileInfoService;
import com.sqfw.project.utils.FTPTools;
import com.sqfw.project.utils.TikaFileValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 知识内容附件信息Service业务层处理
 * 
 * @author tangxt
 * @date 2023-06-09
 */
@Slf4j
@Service
public class KlContentFileInfoServiceImpl implements KlContentFileInfoService
{
    @Autowired
    private KlContentFileInfoMapper klContentFileInfoMapper;

    /** 附件格式：png、jpg、doc、docx、txt、pdf  .xlsx   .xls*/
    private static final String FILE_JPG = ".jpg";
    private static final String FILE_PNG = ".png";
    private static final String FILE_PDF = ".pdf";
    private static final String FILE_DOC = ".doc";
    private static final String FILE_DOCX = ".docx";
    private static final String FILE_TXT = ".txt";
    private static final String FILE_XLSX = ".xlsx";
    private static final String FILE_XLS = ".xls";

    /** 文件大小限制 */
    private static final long THREE_B = 3 * 1024 * 1024;


    /**
     * 查询知识内容附件信息
     * 
     * @param klId 知识内容附件信息主键
     * @return 知识内容附件信息
     */
    @Override
    public KlContentFileInfo selectKlContentFileInfoByKlId(String klId)
    {
        return klContentFileInfoMapper.selectKlContentFileInfoByKlId(klId);
    }

    /**
     * 查询知识内容附件信息列表
     * 
     * @param klContentFileInfo 知识内容附件信息
     * @return 知识内容附件信息
     */
    @Override
    public List<KlContentFileInfo> selectKlContentFileInfoList(KlContentFileInfo klContentFileInfo)
    {
        return klContentFileInfoMapper.selectKlContentFileInfoList(klContentFileInfo);
    }

    /**
     * 新增知识内容附件信息
     * 
     * @param klContentFileInfo 知识内容附件信息
     * @return 结果
     */
    @Override
    public int insertKlContentFileInfo(KlContentFileInfo klContentFileInfo)
    {
        return klContentFileInfoMapper.insertKlContentFileInfo(klContentFileInfo);
    }

    /**
     * 修改知识内容附件信息
     * 
     * @param klContentFileInfo 知识内容附件信息
     * @return 结果
     */
    @Override
    public int updateKlContentFileInfo(KlContentFileInfo klContentFileInfo)
    {
        return klContentFileInfoMapper.updateKlContentFileInfo(klContentFileInfo);
    }

    /**
     * 批量删除知识内容附件信息
     * 
     * @param klIds 需要删除的知识内容附件信息主键
     * @return 结果
     */
    @Override
    public int deleteKlContentFileInfoByKlIds(String[] klIds)
    {
        return klContentFileInfoMapper.deleteKlContentFileInfoByKlIds(klIds);
    }

    /**
     * 删除知识内容附件信息信息
     * 
     * @param klId 知识内容附件信息主键
     * @return 结果
     */
    @Override
    public int deleteKlContentFileInfoByKlId(String klId) {
        KlContentFileInfo klContentFileInfo = new KlContentFileInfo();
        klContentFileInfo.setKlId(klId);
        klContentFileInfo.setKlFileIsDel("1");
        return klContentFileInfoMapper.updateKlContentFileInfo(klContentFileInfo);
    }

    /**
     * 文件上传，成功返回文件id
     * @param file
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public AjaxResult uploadFile(MultipartFile file) {
        try {
            String originalFilename = file.getOriginalFilename();
            KlContentFileInfo klContentFileInfo = new KlContentFileInfo();
            // 文件后缀
            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 附件格式：png、jpg、doc、docx、txt、pdf, .xlsx
            if (FILE_JPG.equals(fileExtension) || FILE_PNG.equals(fileExtension)) {
                klContentFileInfo.setKlFileType(KlFileTypeEnum.FILE_PICTURE.getKey());
            }else if (FILE_PDF.equals(fileExtension)) {
                klContentFileInfo.setKlFileType(KlFileTypeEnum.FILE_PDF.getKey());
            }else if (FILE_DOC.equals(fileExtension) || FILE_DOCX.equals(fileExtension)) {
                klContentFileInfo.setKlFileType(KlFileTypeEnum.FILE_WORD.getKey());
            }else if (FILE_TXT.equals(fileExtension)) {
                klContentFileInfo.setKlFileType(KlFileTypeEnum.FILE_TXT.getKey());
            }else if (FILE_XLSX.equals(fileExtension) || FILE_XLS.equals(fileExtension)) {
                klContentFileInfo.setKlFileType(KlFileTypeEnum.FILE_XLSX.getKey());
            }else {
                return AjaxResult.error("上传文件格式不对：" + fileExtension);
            }
            boolean bool = TikaFileValidator.validateFileExtension(file);
            if (!bool) {
                //文件类型和文件内容不匹配
                return AjaxResult.error("文件类型和文件内容不匹配！");
            }
            // 获取文件大小
            long fileSize = file.getSize();
            klContentFileInfo.setKlFileBytesize(String.valueOf(file.getSize()));
            // 判断文件大小，
            if (fileSize > THREE_B) {
                return AjaxResult.error("文件大于3M了");
            }
            // ftp文件命名格式时间戳
            String filecode = String.valueOf(System.currentTimeMillis());
            String extname = "";
            if (StringUtils.hasText(originalFilename)) {
                // 文件后缀
                extname = originalFilename.substring(originalFilename.lastIndexOf("."));
                filecode += extname;
            }
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String dir = sdf.format(new Date());
            boolean success = FTPTools.upload(file.getInputStream(), filecode, dir);
            if (success) {
                // 文件名
                klContentFileInfo.setKlFileName(originalFilename.substring(0,originalFilename.lastIndexOf(".")));
                // 文件后缀
                klContentFileInfo.setKlFileSuffix(fileExtension);
                // 获取文件类型
                String fileType = file.getContentType();

                // 上传时间
                klContentFileInfo.setKlFileUploadTime(new Date());
                // 1=删除 0=不删除
                klContentFileInfo.setKlFileIsDel("0");
                // 文件路径
                klContentFileInfo.setKlFilePath(Constants.RESOURCE_PREFIX + "/"+dir+"/"+filecode);
                // ftp全路径
                String klFileFullPath = "ftp://" + FTPTools.getUsername() + ":" + FTPTools.getPassword() + "@" + FTPTools.getHost() + "/"+dir+"/"+filecode;
                klContentFileInfo.setKlFileFullPath(klFileFullPath);
                String id = klContentFileInfoMapper.getId();
                klContentFileInfo.setKlId("SQ"+ id);
                klContentFileInfoMapper.insertKlContentFileInfo(klContentFileInfo);
                return AjaxResult.success(klContentFileInfo);
            }else {
                //失败返回空
                return AjaxResult.error("上传失败");
            }
        }catch (Exception e) {
            log.info("上传文件错误信息：{}", e.getMessage());
            return AjaxResult.error("上传失败");
        }

    }


}
